package controllers

import (
	"github.com/gin-gonic/gin"
	"go_pure_admin_api/dto"
	"go_pure_admin_api/global"
	"go_pure_admin_api/models"
)

type RoleController struct {
	BaseController
}

// GetRolesList godoc
// @Summary 获取角色列表
// @Description 获取角色列表
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.GetRoleListDto true "获取角色列表参数"
// @Success 200 {object} ResponseJson
// @Router /role/roleList [post]
func (r *RoleController) GetRolesList(c *gin.Context) {
	data := dto.GetRoleListDto{}
	if err := c.ShouldBindJSON(&data); err != nil {
		r.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	var role models.Roles
	roleList, count, err := role.GetRolesList(data)
	if err != nil {
		r.Fail(c, 500, "获取角色列表失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "获取角色列表成功", dto.GetRoleListResponseDto{
		List:  roleList,
		Total: count,
	})
}

// GetRoleMenu godoc
// @Summary 获取角色菜单
// @Description 获取角色菜单
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Success 200 {object} ResponseJson
// @Router /role/role-menu [post]
func (r *RoleController) GetRoleMenu(c *gin.Context) {
	menus, err := models.GetRoleMenu()
	if err != nil {
		r.Fail(c, 500, "获取角色菜单失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "获取角色菜单成功", menus)
}

// GetRoleMenuIds godoc
// @Summary 获取角色菜单ID
// @Description 获取角色菜单ID
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.GetRoleMenuIdsDto true "获取角色菜单ID参数"
// @Success 200 {object} ResponseJson
// @Router /role/role-menu-ids [post]
func (r *RoleController) GetRoleMenuIds(c *gin.Context) {
	var data dto.GetRoleMenuIdsDto
	if err := c.ShouldBindJSON(&data); err != nil {
		r.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	role := models.Roles{}
	menuIds, err := role.GetRoleMenuIds(data)
	if err != nil {
		r.Fail(c, 500, "获取角色菜单失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "获取角色菜单成功", menuIds)
}

// UpdateRole godoc
// @Summary 更新角色
// @Description 更新角色信息
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.UpdateRoleDto true "更新角色参数"
// @Success 200 {object} ResponseJson
// @Router /role/updateRole [post]
func (r *RoleController) UpdateRole(c *gin.Context) {
	var updateRole dto.UpdateRoleDto
	if err := c.ShouldBindJSON(&updateRole); err != nil {
		r.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	role := models.Roles{}
	err := role.UpdateRole(updateRole)
	if err != nil {
		global.Logger.Errorf("用户%s编辑角色失败:%e", c.GetString("username"), err)
		r.Fail(c, 500, "编辑角色失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "编辑角色成功", nil)
}

// CreateRole godoc
// @Summary 创建角色
// @Description 创建新角色
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.CreateRoleDto true "创建角色参数"
// @Success 200 {object} ResponseJson
// @Router /role/createRole [post]
func (r *RoleController) CreateRole(c *gin.Context) {
	var createRole dto.CreateRoleDto
	if err := c.ShouldBindJSON(&createRole); err != nil {
		r.Fail(c, 400, "参错误:"+err.Error(), nil)
	}
	role := models.Roles{}
	user := models.Users{}
	crtareUser := c.GetString("username")
	err := user.QueryUserByName(crtareUser)
	if err != nil {
		global.Logger.Errorf("用户%s查询添加人失败:%e", c.GetString("username"), err)
		r.Fail(c, 500, "查询添加人失败:"+err.Error(), nil)
		return
	}
	role.CreatedUser = user
	if err := role.CreateRole(createRole); err != nil {
		global.Logger.Errorf("用户%s添加角色失败:%e", c.GetString("username"), err)
		r.Fail(c, 500, "添加角色失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "添加角色成功", nil)
}

// UpdateRoleMenu godoc
// @Summary 更新角色菜单
// @Description 更新角色菜单权限
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.UpdateRoleMenuDto true "更新角色菜单参数"
// @Success 200 {object} ResponseJson
// @Router /role/updateRoleMenu [post]
func (r *RoleController) UpdateRoleMenu(c *gin.Context) {
	var updateRoleMenu dto.UpdateRoleMenuDto
	if err := c.ShouldBindJSON(&updateRoleMenu); err != nil {
		r.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	role := models.Roles{}
	err := role.UpdateRoleMenu(updateRoleMenu)
	if err != nil {
		global.Logger.Errorf("用户%s更新角色菜单失败:%e", c.GetString("username"), err)
		r.Fail(c, 500, "更新角色菜单失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "更新角色菜单成功", nil)
}

// DeleteRole godoc
// @Summary 删除角色
// @Description 删除指定角色
// @Tags 角色管理
// @Accept  json
// @Produce  json
// @Param data body dto.DeleteRoleDto true "删除角色参数"
// @Success 200 {object} ResponseJson
// @Router /role/deleteRole [post]
func (r *RoleController) DeleteRole(c *gin.Context) {
	var deleteRoleDto dto.DeleteRoleDto
	if err := c.ShouldBindJSON(&deleteRoleDto); err != nil {
		r.Fail(c, 400, "参数错误:"+err.Error(), nil)
	}
	role := models.Roles{}
	err := role.DeleteRole(deleteRoleDto)
	if err != nil {
		global.Logger.Errorf("用户%s删除角色失败:%e", c.GetString("username"), err)
		r.Fail(c, 500, "删除角色失败:"+err.Error(), nil)
		return
	}
	r.Success(c, "删除角色成功", nil)
}
